Inyección de PHP V8JS basada en el tiempo y NoSQL/inyección de SSJS

Detectando vulnerabilidades de inyección JavaScript del lado del servidor (SSJS) utilizando técnicas basadas en el tiempo. Artículo de Felipe Aragón - 25 de febrero de 2012

Este artículo, que es una actualización de un artículo que publicamos originalmente el 18 de diciembre de 2011, pretende resaltar el riesgo de entrada no validada utilizada para ejecutar JavaScript del lado del servidor.'


Al leer esto, los desarrolladores web son empezando a aprender cómo utilizar V8Js (Motor JavaScript V8 de Google) en PHP, o MongoDB, que es una base de datos NoSQL escalable, de alto rendimiento y de código abierto que también permite utilizar JavaScript en consultas. Hoy en día, la fuente más común de fallos de seguridad de PHP es la entrada no validada. Dan lugar a SQL Injection, XSS, Remote Command Execution, Local and Remote File Inclusion, etc (conocido como PHP Top 5). Con la creciente adopción de JavaScript del lado del servidor, podemos esperar que las vulnerabilidades de inyección de JS del lado del servidor causadas por la entrada de usuario no validada se hagan prevalentes, y las técnicas para explotarlas, algo común. En Syhunt, ya hemos comenzado una colección de técnicas para detectar proactivamente defectos de inyección de JS en el lado del servidor.

'La técnica de inyección JS basada en el tiempo'

Inyectar un custom sleep code es una técnica que se puede utilizar para detectar vulnerabilidades de inyección en aplicaciones web utilizando la ejecución de JavaScript del lado del servidor. Esto funciona con cualquier sistema web que soporte la ejecución de JavaScript del lado del servidor, como marcos de aplicaciones web JavaScript y servidores como Jaxer, o PHP con V8Js, o motores NoSQL como MongoDB.

A continuación puedes encontrar ejemplos de servidor del lado JavaScript vulnerabilidades de inyección en PHP que podrían ser detectadas usando la técnica de espera. En el pasado, utilizamos este mismo código de espera en el ' client-side ' ' para demostrar cómo se podían explotar las vulnerabilidades que encontramos en A-A-S (Servidor de acceso de aplicaciones)?.

Ejemplo 1: Vulnerabilidades de inyección de PHP V8JS (PHP + V8Js)

Las siguientes peticiones harían que estas aplicaciones web vulnerables (o similares) duerman durante 10 segundos:

vulnerable.php?msg=a';d%20=%20new%20Date();do{cd=new%20Date();}while(cd-d<10000);foo='bar

Código Vulnerable:


$msg = $_GET['msg'];
$v8 = new V8Js();
$v8->executeString("var msg = '$msg'; ..SOME CODE..");

vulnerable.php?msg=version());d%20=%20new%20Date();do{cd=new%20Date();}while(cd-d<10000);foo=('bar'

Código Vulnerable:


$msg = $_GET['msg'];
$v8 = new V8Js();
$JS = <<< EOT
len = print($msg + "\\n");
..SOME CODE..
EOT;

$v8->executeString($JS, 'basic.js');

Ejemplo 2: Vulnerabilidad de inyección de NoSQL SSJS (PHP + MongoDB)

The MongoDB shell proporciona una función 'sleep() [1]%, lo que facilita mucho la detección basada en el tiempo.

Las siguientes peticiones harían que estas aplicaciones web vulnerables (o similares) duerman durante 10 segundos:

vulnerable.php?msg=1';sleep(10000);var%20foo='bar

A función MongoDB sleep() funciona con milisegundos.

Técnica alternativa usando un código Sleep personalizado:

vulnerable.php?msg=1';d=new%20Date();do{cd=new%20Date();}while(cd-d<10000);foo='bar

Código Vulnerable:


<?
$mongo = new Mongo();
$db = $mongo->demo;
$id = $_GET['id'];
$js = "function() {
var id = '$id';
SOME CODE...
}";
$response = $db->execute($js);
...
?>

Ejemplo 3: Vulnerabilidad de inyección de NoSQL SSJS (PHP + MongoDB)

Código Vulnerable:


<?
$mongo = new Mongo();
$db = $mongo->demo;
$year = $_GET['year'];
$collection = $db->demo;
$query = 'function() {var search_year = \'' .
$year . '\';' .
'return this.publicationYear == search_year || ' .
' this.filmingYear == search_year || ' .
' this.recordingYear == search_year;}';
$cursor = $collection->find(array('$where' => $query));
...
?>

Ejemplo 4: Vulnerabilidad de inyección de SSJS (PHP + Jaxer)

Ejemplo de una aplicación vulnerable construida usando Jaxer Ajax server y PHP.

Código Vulnerable:


<?php
$myVar = $_GET['id'];

echo "<script runat=server>
    myPHPVar = '$myVar';
    onload = function(){
    ..SOME CODE..
    };
</script>";
?>

Ejemplo 5: Sleep en JavaScript


var date = new Date();
do { curDate = new Date(); }
while(curDate-date < 10000); // delay time (ms)

''SSJS Remote Scanner

Tenemos que pensar en el futuro sobre los ataques cibernéticos. Esto es algo que perseguimos activamente mientras desarrollamos el escáner Syhunt Dynamic?. Syhunt Dynamic es el primer escáner de aplicaciones web en realizar una inyección de JavaScript en el servidor basado en el tiempo.

Información adicional

La llegada del Big Data y el Cloud Computing está impulsando la adopción de NoSQL en la empresa. Debido a esto, se espera que las vulnerabilidades relacionadas con NoSQL se vuelvan mucho más generalizadas %.

En julio del año pasado, Bryan Sullivan, un investigador de seguridad senior de Adobe Systems, demostró vulnerabilidades de inyección de JavaScript en aplicaciones web desde el servidor usando MongoDB y otros motores de base de datos NoSQL. Demostró cómo se podían utilizar para realizar denegación de servicio, sistema de archivos, ejecución de comandos remotos y muchos otros ataques, incluyendo la fácil extracción de todo el contenido de la base de datos NoSQL -- un ataque de inyección NoSQL ciego (paper here ).

Solución

Validar siempre la entrada de usuario utilizada en los comandos JavaScript del servidor.

Links

Contacto